package com.dems.domain.enumerate;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections4.CollectionUtils;

import java.util.Arrays;
import java.util.List;

public enum UserTypeEnum {

    // 现场经理
    M("M", "现场经理"),

    // 一级代理 主管
    L1("L1", "一级代理"),

    // 二级代理 默认
    L2("L2", "二级代理"),

    // 超管用户
    T("T", "超管"),

    // 普通用户（Normal）
    N("N", "普通用户"),

    // C-坐席（CallOut）
    C("C", "坐席"),

    //F-前台（FrontEnd）
    F("F", "前台"),

    //F-前台（FrontEnd）
    BIZ_FRONT("BIZ_FRONT", "公共前台"),

    //V-接待（Visit）
    V("V", "接待"),

    //V-公共接待（Visit）
    BIZ_VISIT("BIZ_VISIT", "公共接待"),

    //V-公共接待主管（Visit）
    BIZ_VISIT_L("BIZ_VISIT_L", "公共接待主管"),

    //VL-接待主管（Visit-LEADER）
    VL("VL", "接待主管"),

    //VL-接待主管（Visit-LEADER）
    VM("VM", "接待经理"),

    //B-银行业务员（Bank）
    B("B", "银行业务员"),

    //NM-名单管理员（Names Manager）
    NM("NM", "名单管理员"),


    //CLM-线路管理员（Names Manager）
    CALL_LINE_MANAGER("CALL_LINE_MANAGER", "线路管理员"),

    //NM-名单管理员（Names Manager）
    HR("HR", "人事"),

    SYSTEM("SYSTEM", "系统用户"),

    ;

    private String code;

    private String desc;

    UserTypeEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public static UserTypeEnum convert(String code) {
        if (StringUtils.isBlank(code)) {
            return UserTypeEnum.L2;
        }

        if (code.startsWith("-")) {
            code = code.replace("-", "");
        }

        for (UserTypeEnum item : UserTypeEnum.values()) {
            if (item.getCode().equals(code)) {
                return item;
            }
        }
        return UserTypeEnum.L2;

    }

    public static Boolean checkType(String code, UserTypeEnum... targetUserType) {

        if (StringUtils.isBlank(code) || targetUserType == null) {
            return Boolean.FALSE;
        }

        for (String codeItem : code.split(",")) {
            UserTypeEnum userType = UserTypeEnum.convert(codeItem);
            for (UserTypeEnum item : targetUserType) {
                if (userType.equals(item)) {
                    return Boolean.TRUE;
                }
            }
        }

        return Boolean.FALSE;
    }

    public static Boolean checkTypeRole(String code, List<String> roleCodeList, UserTypeEnum... targetUserType) {

        if (CollectionUtils.isEmpty(roleCodeList)) {
            return Boolean.FALSE;
        }

        if (CollectionUtils.isNotEmpty(roleCodeList)) {
            for (String codeItem : roleCodeList) {
                UserTypeEnum userType = UserTypeEnum.convert(codeItem);
                for (UserTypeEnum item : targetUserType) {
                    if (userType.equals(item)) {
                        return Boolean.TRUE;
                    }
                }
            }
        }

        return Boolean.FALSE;
    }

    /**
     * 只校验唯完全匹配角色
     * @param roleCodeList
     * @param targetUserType
     * @return
     */
    public static Boolean checkRoleOnly(List<String> roleCodeList, UserTypeEnum... targetUserType) {

        if (CollectionUtils.isEmpty(roleCodeList) || targetUserType == null) {
            return Boolean.FALSE;
        }

        if (roleCodeList.size() != targetUserType.length) {
            return Boolean.FALSE;
        }

        for (String codeItem : roleCodeList) {
            UserTypeEnum userType = UserTypeEnum.convert(codeItem);
            boolean check = Boolean.FALSE;
            for (UserTypeEnum item : targetUserType) {
                if (userType.equals(item)) {
                    check = Boolean.TRUE;
                    break;
                }
            }
            if (!check) {
                return Boolean.FALSE;
            }
        }

        return Boolean.TRUE;
    }

    /**
     * 校验用户是否有效
     * @param code
     * @return
     */
    public static Boolean checkValid(String code) {

        return !(StringUtils.isBlank(code) || code.startsWith("-"));

    }


    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }


}
